package Sort;

/**
 * Created by sunwei on 2017/9/28
 * Time:10:52
 */
public class PersonSort {
    Person a[];
    int nElems;

    public PersonSort(int maxSize) {
        a=new Person[maxSize];
        nElems = 0;
    }
    //增加人的信息,传入人的基本信息
    public void addPerson(String firstName,String lastName,int age){
        a[nElems] = new Person(firstName,lastName,age);//根据所传入的人的基本信息，实例化一个person对象，再将这个对象放到数组里面
        nElems++;//每次调用这个函数，nElems得值就加上1
    }
    //显示人的信息
    public void deployPersons(){
        for(int i = 0; i <nElems ; i++) {
            System.out.println("第"+i+"个人：");
            a[i].deployPerson();
        }
    }
    //冒泡排序
    public void PersonBubbleSort(){
        int in,out;
        for(out= nElems-1;out>0 ;out--) {
            for(in = 0;in<out ;in++) {
                if (a[in].getFirstName().compareTo(a[in+1].getFirstName().toString())>0) {
                      Person temp;
                      temp = a[in];
                      a[in] = a[in+1];
                      a[in+1] = temp;
                }
            }
        }
    }
    //插入排序：有一个分界线的元素，在分界线左边的元素一定是排序好的，所以插入排序先确定分界线out就好了
    public void PersonInsertionSort(){
        int in,out;
        for(out= 1;out<nElems;out++) {//out=1即从第二个元素开始，此时默认第一个元素是最小的，out=1此时是分界线
            Person temp = a[out];//将记号放在a[out]处，保存此时的a[out]的值
            in=out;//将in的初始值设为分界线的值
            while (in>0&&a[in-1].getFirstName().compareTo(temp.getFirstName())>=0){//这里把a[in-1]和temp标记的值相比，不能直接用a[out]代替，因为a[out]元素的值一直在变
                a[in] = a[in-1];//将所有比temp大的元素向后移动，直到找到一个比in-1小的
                --in;
            }
            a[in] = temp;//跳出循环时，就说明比temp大的都右移一位了，此时，可以把temp放到此时的位置了

        }
    }
    //选择排序：就是扫描一遍数组，找到一个最小的元素，然后将最小的元素放到序列的最左边，就这样一直扫描
    public void PersonSelectSort(){
        int in,out,min;//设置一个记号，这个记号标记的是，最小的元素
        for(out = 0;out<nElems-1;out++) {//先从序列的最左端开始
            min = out;//每一次循环都是将剩下的序列的最左端的元素标为最小的
            for(in=out+1;in<nElems;in++) {//然后内层循环总是从后面一个数据开始扫描
                if (a[min].getFirstName().compareTo(a[in].getFirstName())>0) {
                    min = in;//找到最小的元素后将原来的元素划掉，将毛巾放到此时元素的位置
                }
            }
            //找到最小的元素后，将这个最小的元素和最左边的元素交换位置，这样扫描一次就选择出了一个最小的元素
            Person temp;
            temp = a[min];
            a[min] = a[out];
            a[out] = temp;
        }
    }
}
